package com.lvmama.service.dw.impl;

import com.alibaba.fastjson.JSONObject;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.lvmama.common.enums.RecommendEnum;
import com.lvmama.common.exception.GlobalException;
import com.lvmama.dao.dw.RecommendAnalysisDao;
import com.lvmama.pojo.dto.dw.RecommendAnalysisQuery;
import com.lvmama.pojo.entity.dw.recommend.OverView;
import com.lvmama.pojo.entity.dw.recommend.RecommendAnalysis;
import com.lvmama.pojo.entity.dw.recommend.Trend;
import com.lvmama.service.dw.RecommendAnalysisService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;

/**
 * @param
 * @Title:
 * @Author:wangpeng
 * @Description: TODO(这里用一句话描述这个方法的作用)
 * @return
 * @throws
 */
@Slf4j
@Service
public class RecommendAnalysisServiceImpl  implements RecommendAnalysisService {

	@Autowired
	RecommendAnalysisDao dao;

	/**
	 * 根据条件导出csv的数据
	 * @param raDTO
	 * @return
	 * @throws GlobalException
	 */
	@Override
	public List<RecommendAnalysis> exportList(RecommendAnalysisQuery raDTO) throws GlobalException {
		log.info("start exportList");
		List<RecommendAnalysis> detailList = null;
		try {
			detailList = dao.detailList(raDTO);
		}catch (Exception e){
			log.error("exportList error:",e.getMessage(),e);
		}
		return detailList;
	}

	/**
	 * 业务：数据概览
	 * 根据条件查询 ->数据概览的数据
	 * @param raDTO
	 * @return OverView
	 */
	@Override
	public OverView overview(RecommendAnalysisQuery raDTO) throws GlobalException{
		log.info(" start overview");
		OverView overView = null;
		try{
			overView = dao.overview(raDTO);
			/**
			 * 点击率：点击数/推荐次数
			 */
			if(overView != null && overView.getTotalRecommend() > 0)
				overView.setClickRate(overView.getTotalClick()/overView.getTotalRecommend());
			/**
			 * 转换率：订单数/点击数
			 */
			if(overView != null && overView.getTotalClick() > 0)
				overView.setConversionRate(overView.getTotalOrder()/overView.getTotalClick());

			if(overView != null) log.info("overview : "+overView);

		}catch (Exception e){
			log.error("overview:", e.getMessage(), e);
		}
		return overView;
	}

	/**
	 * 业务：数据趋势
	 * 根据条件查询 ->数据按照日期进行分组统计,得到每一日的点击率,转换率等数据
	 * @param raDTO
	 * @return Trend
	 */
	@Override
	public Trend trend(RecommendAnalysisQuery raDTO) throws GlobalException{
		Trend result = null;
		log.info("start trend");
		try {
			/**
			 * 查询数据库中的原始数据
			 */
			List<OverView> rawList = dao.trend(raDTO);
			if(rawList != null && !rawList.isEmpty())
				result = trend(rawList);
		}catch (Exception e){
			log.error("trend",e.getMessage(),e);
		}
		return result;
	}

	/**
	 * 从数据库中查询的数据没有根据日期对指标的值进行分类汇总
	 * @param list
	 * @return
	 */
	public Trend trend(List<OverView> list){
		Trend result = new Trend();
		/**
		 * 存放指标也就是品类
		 */
		List<String> category = new ArrayList<>();
		/**
		 * 存放日期
		 */
		TreeSet<String> days = new TreeSet<>();
		/**
		 * 第一个String存放日期,第二个String存放指标,Double存放指标对应的数值
		 */
		Map<String,Map<String,Double>> map = new HashMap<>();

		for(OverView o :list){
			/**
			 * 日期若没有在treeset内则加入该集合
			 */
			if(!days.contains(o.getDateDate()))
				days.add(o.getDateDate());
			/**
			 * 某个日期没有创建对象map的,给该日期创建map
			 */
			if(map.get(o.getDateDate()) == null)
				map.put(o.getDateDate(),new HashMap<>());
			/**
			 * 在每一天中put进入各个指标对应的值,以此来做分类
			 */
			map.get(o.getDateDate()).put(RecommendEnum.CLICKRATE.getCode(),o.getClickRate());
			map.get(o.getDateDate()).put(RecommendEnum.TOTALCLICK.getCode(),o.getTotalClick());
			map.get(o.getDateDate()).put(RecommendEnum.TOTALRECOMMEND.getCode(),o.getTotalRecommend());
		}
		/**
		 * 当日期不存在时,数据没有意义，则直接返回空的返回值
		 */
		if(days.isEmpty()) return result;

		/**
		 * 用于存放各个品类的数值集合,用于构造图表中的series，其为一组Json对象的列表
		 * 每一个json对象包含了名称,类型和一组以日期排序的list值
		 */
		Map<String,List<Double>> allCategory = new HashMap<>();

		/**
		 * 遍历日期集合
		 */
		for(String day : days){
			/**
			 * 遍历各项指标
			 */
			for(RecommendEnum e : RecommendEnum.values()){
				if(allCategory.get(e.getCode()) == null)
					allCategory.put(e.getCode(),new ArrayList<>());
				/**
				 * 某一日,某个指标的值
				 */
				double temp = map.get(day).get(e.getCode());
				allCategory.get(e.getCode()).add(temp);
			}
		}

		List<JSONObject> series = new ArrayList<>();

		/**
		 * 根据allCategory组装series作为图表数据
		 */
		for(String str :allCategory.keySet()){
			JSONObject o = new JSONObject();
			o.put("name",RecommendEnum.getByCode(str).getName());
			o.put("type","line");
			o.put("data",allCategory.get(str));
			series.add(o);
		}

		for(RecommendEnum e:RecommendEnum.values()){
			category.add(e.getName());
		}
		/**
		 * 封装返回值
		 */
		result.setCategory(category);
		result.setSeries(series);
		result.setDate(days);
		return result;
	}

	/**
	 * 业务：明细指标表格数据
	 * 根据条件查询 ->查询数据库中的原始数据明细
	 * @param raDTO
	 * @return PageInfo<RecommendAnalysis>
	 */
	@Override
	public PageInfo<RecommendAnalysis> detailList(RecommendAnalysisQuery raDTO) {
		log.info("start detailList");
		List<RecommendAnalysis> detailList = null;
		try {
			PageHelper.startPage(raDTO.getCurrentPage(), raDTO.getPageSize());
			detailList = dao.detailList(raDTO);
		}catch (Exception e){
			log.error("detailList error:",e.getMessage(),e);
		}
		return new PageInfo<>(detailList);
	}
}
